Registrace souboru ocx do systemu - druhy pokus

Otázka od: Ing. Dubsky Jan

26. 10. 2004 9:28

Budto muj dotaz zapadl, nebo to nikdo nevi. Nicmene zkusim se zeptat znovu.

V D6 vytvarim projekt, ktery vyuziva prvek ActivX - komponentu pro
zobrazovani inventorovskych vykresu - soubor InventorViewCtrl.ocx.

Na svem pocitaci mam knihovnu zaregistrovanou pomoci Delphi, takze program
funguje OK. Ale pokud spustim exe soubor na stroji, kde knihovna neni
registrovana, tak to spadne. Jak se registruje tato knihovna, ktera je
fyzicky ulozena na serveru v adresari meho programu na okolni pocitace.

Videl bych to asi tak, ze si pri spusteni muj program zjisti, jestli je
knihovna registrovana, pokud ano, je to OK, pokud ne - tj. pri prvnim
spusteni, tak ji zaregistruje. Nebo nejaka externi utilitka, kterou spustim
rucne pri nastavovani - instalaci meho SW.

Jiz jsem zkousel pouzit program regsvr32 z windowsu - nahlasil chybu -
Provedeni funkce LoadLybray(......) se nezdarilo - uvedeny modul nebyl
nalezen.

Zkousel jsem studovat i unitu v prikladech (..\Demos\ActiveX\TRegSvr), ale
je to na me prilis vysoka matematika. Zkuste me trochu nakopnout, nebo
poslat cast prislusneho kodu, kterym si prvek ActivX zaregistruji na
libovolnem stroji.

Dik

Honza



Odpovedá: Ondrej Kelle

26. 10. 2004 10:05

> Videl bych to asi tak, ze si pri spusteni muj program zjisti,
> jestli je knihovna registrovana, pokud ano, je to OK, pokud
> ne - tj. pri prvnim spusteni, tak ji zaregistruje. Nebo
> nejaka externi utilitka, kterou spustim rucne pri
> nastavovani - instalaci meho SW.
>
> Jiz jsem zkousel pouzit program regsvr32 z windowsu - nahlasil chybu -
> Provedeni funkce LoadLybray(......) se nezdarilo - uvedeny modul nebyl
> nalezen.

Ten subor musi na tom pocitaci byt, na mieste, kde ho system najde
(nastavenie PATH). Typicky su .ocx subory instalovane do windows system
directory (\WINNT\System32).
Ak ta .ocx kniznica vyzaduje nejake dalsie subory, musis ich tam skopirovat
tiez.
Potom by nemal byt problem zaregistrovat ju pomocou nastroja regsvr32.

> Zkousel jsem studovat i unitu v prikladech
> (..\Demos\ActiveX\TRegSvr), ale
> je to na me prilis vysoka matematika. Zkuste me trochu nakopnout, nebo
> poslat cast prislusneho kodu, kterym si prvek ActivX zaregistruji na
> libovolnem stroji.

Mozno je to demo nejasne, pretoze pouziva parametre z command line. Je to
velmi jednoduche, staci zavolat exportovanu funkciu s nazvom
'DllRegisterServer'. Procedura na registraciu by mohla vyzerat aj takto:

procedure RegisterAxLib(const FileName: string);
const
  SRegProcName = 'DllRegisterServer';
var
  LibHandle: THandle;
  RegProc: TRegProc;
begin
  LibHandle := LoadLibrary(PChar(FileName));
  if LibHandle = 0 then
    raise Exception.CreateFmt(SLoadFail, [FileName]);
  try
    @RegProc := GetProcAddress(LibHandle, SRegProcName);
    if @RegProc = nil then
      raise Exception.CreateFmt(SCantFindProc, [SRegProcName]);
    if RegProc <> 0 then
      raise Exception.CreateFmt(SRegFail, [SRegProcName, FileName]);
  finally
    FreeLibrary(LibHandle);
  end;
end;

Ak potrebujes programovo zistit, ci je dana .ocx uz zaregistrovana, budes
asi musiet hladat, ci su v registry GUID, ktore ta .ocx pouziva.

HTH
TOndrej

Odpovedá: Ing. Pavel Spisar

26. 10. 2004 11:32

Ahoj ja pouzivam pro jine OCX nasledujici funkci
vysvetleni
1-registrace pomoci TREGSVR.EXE - najdes v DELPHI
2-registrace pomoci regsvr32.exe - ve WINDOWS
3-rucni zapsani hodnot do registru (najdi u sebe v registru, uloz a modifikuj
do PAS)[v prikladu zkraceno]

Pozor, pozor k OCX byva vzdy jeste nejake to DLL, .....
// -----------------------------------------------------------------------------

function Registruj(typ:integer;umisteni:string):boolean;
var
  ws,prog_reg:string;
  Reg:TRegistry;
begin
  Registruj:=false;
  case typ of
    1,2:begin
      case typ of
        1:begin
          prog_reg:='TREGSVR.EXE';
          ws:=umisteni;//umisteni aplikace
        end;
        2:begin
          prog_reg:='regsvr32.exe';
          SetLength(ws,256);
          GetSystemDirectory(PChar(ws),256);//zjisteni systemoveho adresare
WINDOWS
          ws:=StrPas(PChar(ws));
        end;
      end;
      ws:=ws+'\'+prog_reg;
      if FileExists(ws)=false then exit;
      Winexec(PChar(ws+' '+umisteni+'\GRAPH32.OCX'),SW_MINIMIZE);
    end;
    3:begin
      Reg:=TRegistry.Create;
      Reg.RootKey:=HKEY_LOCAL_MACHINE;
      
Reg.OpenKey('SOFTWARE\Classes\CLSID\{0842D100-1E19-101B-9AAF-1A1626551E7C}',True);
      Reg.WriteString('','Pinnacle-BPS Graph Control');
      Reg.CloseKey;
      
     //atd atd atd

      Reg.Destroy;
    end;
  end;
  Registruj:=True;
end;
// -----------------------------------------------------------------------------


Ondrej Kelle wrote:
>> Videl bych to asi tak, ze si pri spusteni muj program zjisti,
>> jestli je knihovna registrovana, pokud ano, je to OK, pokud
>> ne - tj. pri prvnim spusteni, tak ji zaregistruje. Nebo
>> nejaka externi utilitka, kterou spustim rucne pri
>> nastavovani - instalaci meho SW.
>>
>> Jiz jsem zkousel pouzit program regsvr32 z windowsu - nahlasil chybu
>> - Provedeni funkce LoadLybray(......) se nezdarilo - uvedeny modul
>> nebyl nalezen.
>
> Ten subor musi na tom pocitaci byt, na mieste, kde ho system najde
> (nastavenie PATH). Typicky su .ocx subory instalovane do windows
> system directory (\WINNT\System32).
> Ak ta .ocx kniznica vyzaduje nejake dalsie subory, musis ich tam
> skopirovat tiez.
> Potom by nemal byt problem zaregistrovat ju pomocou nastroja regsvr32.
>
>> Zkousel jsem studovat i unitu v prikladech
>> (..\Demos\ActiveX\TRegSvr), ale
>> je to na me prilis vysoka matematika. Zkuste me trochu nakopnout,
>> nebo poslat cast prislusneho kodu, kterym si prvek ActivX
>> zaregistruji na libovolnem stroji.
>
> Mozno je to demo nejasne, pretoze pouziva parametre z command line.
> Je to velmi jednoduche, staci zavolat exportovanu funkciu s nazvom
> 'DllRegisterServer'. Procedura na registraciu by mohla vyzerat aj
> takto:
>
> procedure RegisterAxLib(const FileName: string);
> const
> SRegProcName = 'DllRegisterServer';
> var
> LibHandle: THandle;
> RegProc: TRegProc;
> begin
> LibHandle := LoadLibrary(PChar(FileName));
> if LibHandle = 0 then
> raise Exception.CreateFmt(SLoadFail, [FileName]);
> try
> @RegProc := GetProcAddress(LibHandle, SRegProcName);
> if @RegProc = nil then
> raise Exception.CreateFmt(SCantFindProc, [SRegProcName]);
> if RegProc <> 0 then
> raise Exception.CreateFmt(SRegFail, [SRegProcName, FileName]);
> finally
> FreeLibrary(LibHandle);
> end;
> end;
>
> Ak potrebujes programovo zistit, ci je dana .ocx uz zaregistrovana,
> budes asi musiet hladat, ci su v registry GUID, ktore ta .ocx pouziva.
>
> HTH
> TOndrej


Odpovedá: Ing. Dubsky Jan

27. 10. 2004 6:33

Tomu bych rozumel, ale jeste potrebuji poradit, co mam dat do uses,
aby program znal TRegProc, SLoadFail, SRegFail atd. Na vsechny tyto veci
hlasi undeclared identifier.

Diky

Honza



> procedure RegisterAxLib(const FileName: string);
> const
> SRegProcName = 'DllRegisterServer';
> var
> LibHandle: THandle;
> RegProc: TRegProc;
> begin
> LibHandle := LoadLibrary(PChar(FileName));
> if LibHandle = 0 then
> raise Exception.CreateFmt(SLoadFail, [FileName]);
> try
> @RegProc := GetProcAddress(LibHandle, SRegProcName);
> if @RegProc = nil then
> raise Exception.CreateFmt(SCantFindProc, [SRegProcName]);
> if RegProc <> 0 then
> raise Exception.CreateFmt(SRegFail, [SRegProcName, FileName]);
> finally
> FreeLibrary(LibHandle);
> end;
> end;


Odpovedá: Milan Tomes

27. 10. 2004 7:07

type
TRegProc = function: HRESULT; stdcall;

resourcestring
SLoadFail = 'Nepovedlo se nahrat knihovnu %s';
SCantFindProc = 'V knihovne nebyla nalezena funkce %s';
SRegFail = 'Registrace se nezdarila (funkce %s v knihovne %s)';

> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of Ing. Dubsky Jan
> Sent: Wednesday, October 27, 2004 7:34 AM
>
> Tomu bych rozumel, ale jeste potrebuji poradit, co mam dat do uses,
> aby program znal TRegProc, SLoadFail, SRegFail atd. Na vsechny tyto veci
> hlasi undeclared identifier.
>
> Diky
>
> Honza
>
>
> > procedure RegisterAxLib(const FileName: string);
> > const
> > SRegProcName = 'DllRegisterServer';
> > var
> > LibHandle: THandle;
> > RegProc: TRegProc;
> > begin
> > LibHandle := LoadLibrary(PChar(FileName));
> > if LibHandle = 0 then
> > raise Exception.CreateFmt(SLoadFail, [FileName]);
> > try
> > @RegProc := GetProcAddress(LibHandle, SRegProcName);
> > if @RegProc = nil then
> > raise Exception.CreateFmt(SCantFindProc, [SRegProcName]);
> > if RegProc <> 0 then
> > raise Exception.CreateFmt(SRegFail, [SRegProcName, FileName]);
> > finally
> > FreeLibrary(LibHandle);
> > end;
> > end;
>
>
>
>


Odpovedá: tondrej@t-online.de

27. 10. 2004 7:01

> Tomu bych rozumel, ale jeste potrebuji poradit, co mam dat do uses,
> aby program znal TRegProc, SLoadFail, SRegFail atd. Na vsechny tyto veci
> hlasi undeclared identifier.

Najdes ich v $(DELPHI)\Demos\ActiveX\TRegSvr. Mozes si ich odtial
skopirovat do svojho projektu.

HTH
TOndrej